package edu.hut.bookshop.service.impl;

import edu.hut.bookshop.dao.UserMapper;
import edu.hut.bookshop.exception.CustomizeException;
import edu.hut.bookshop.pojo.Admin;
import edu.hut.bookshop.pojo.User;
import edu.hut.bookshop.service.LoginRegisterService;
import edu.hut.bookshop.util.ResultCode;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.UUID;

/**
 * @Description: 登录注册模块实现类
 * @Author: guozongchao
 * @Date: 2020/6/1 21:50
 */
@Service
public class LoginRegisterServiceImpl implements LoginRegisterService {

    @Resource
    private UserMapper userMapper;

    /**
     * 用户登录处理
     * @param record
     * @param session
     */
    @Override
    public void userLogin(User record, HttpSession session) {
        User user=userMapper.selectByUserName(record.getUserName());
        if(user==null){
            //用户不存在
            throw new CustomizeException(ResultCode.USER_NOT_FOUND);
        }
       /* if(!user.getPassword().equals(record.getPassword())){
            //密码错误
            throw new CustomizeException(ResultCode.PASSWORD_ERROR);
        }*/
        //检测用户的密码是否匹配
        //1.先获取到数据库中的加密之后的密码
        String oldPassword = user.getPassword();
        //2.和用户传递过来的密码进行比较
        //2.0先获取盐值:上一次在注册时所自动生成的盐值
        String salt = user.getSalt();
        //2.1将用户的密码按照相同的md5算法的规则进行加密
        String newMd5Password = getMD5Password(record.getPassword(),salt);
        //3.将密码进行比较
        if(!newMd5Password.equals(oldPassword)){
            throw new CustomizeException(ResultCode.PASSWORD_ERROR);
        }
        session.setAttribute("user",user);
    }

    /**
     * 用户注册处理
     * @param record
     */
    @Override
    public void userRegister(User record) {
        User user=userMapper.selectByUserName(record.getUserName());
        if(user!=null){
            throw new CustomizeException(ResultCode.FAILED,"用户名已存在");
        }
        /*
         * 密码加密处理的实现：md5算法的形式
         * 串+password+串  ---md5算法进行加密,连续加载三次
         * 盐值+password+盐值 ---盐值：随机字符串*/
        String oldPassword = record.getPassword();
        //获取盐值（随机生成应该字符串）
        String salt = UUID.randomUUID().toString().toUpperCase();
        //补全数据：盐值的记录
        record.setSalt(salt);
        //将密码和盐值作为一个整体进行加密处理,忽略原有密码强度，提升了数据的安全性
        String md5Password = getMD5Password(oldPassword,salt);
        //将加密之后的密码重新补全设置到user对象中
        record.setPassword(md5Password);
        userMapper.insert(record);
    }

    @Override
    public void adminLogin(Admin admin, HttpSession session) {

    }
    /*定义一个md5算法的加密处理*/
    public String getMD5Password(String password,String salt){
        //md5加密算法的调用(进行三次加密)
        for (int i=0;i<3;i++) {
            password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
        }
        //返回加密之后的密码
        return password;
    }
}
